﻿namespace Trancity
{
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;

    public class ComputeTimeDialog : Form
    {
        private Button _cancelButton;
        private IContainer _components;
        private ProgressBar _progressBar;
        private bool _refreshing;
        private string _text;
        private Timer _timer;
        private Игрок[] _игроки;
        private World _мир;
        private Trip _рейс;
        private Transport _транспорт;

        public ComputeTimeDialog(World мир, int typeOfTransport, Trip рейс)
        {
            InitializeComponent();
            _мир = мир;
            _рейс = рейс;
            _игроки = new Игрок[0];
            var парк = new Парк("");
            var route = new Route(typeOfTransport, "");
            route.orders = new[] { new Order(парк, route, "", "") };
            route.orders[0].рейсы = new[] { рейс };
            switch (typeOfTransport)
            {
                case TypeOfTransport.Tramway:
                    _транспорт = new Трамвай.ЛМ_68М((Рельс)рейс.дорога_отправления, 0.0, Управление.Автоматическое, парк, route, 0);
                    break;
                case TypeOfTransport.Trolleybus:
                    {
                        var point = new Double3DPoint
                                        {
                                            xz_point = рейс.дорога_отправления.концы[0],
                                            y = рейс.дорога_отправления.высота[0]
                                        };
                        _транспорт = new Троллейбус.ОбычныйТроллейбус(Модели.Троллейбусы[0], point, new DoublePoint(рейс.дорога_отправления.направления[0], 0.0), Управление.Автоматическое, парк, route, null);
                    }
                    break;
                case TypeOfTransport.Bus:
                    {
                        var point2 = new Double3DPoint
                                         {
                                             xz_point = рейс.дорога_отправления.концы[0],
                                             y = рейс.дорога_отправления.высота[0]
                                         };
                        _транспорт = new Троллейбус.ОбычныйТроллейбус(Модели.Автобусы[0], point2, new DoublePoint(рейс.дорога_отправления.направления[0], 0.0), Управление.Автоматическое, парк, route, null);
                    }
                    break;
            }
            _транспорт.наряд = route.orders[0];
            _транспорт.рейс = рейс;
            мир.транспорты.Add(_транспорт);
            _progressBar.Maximum = (int) Math.Ceiling(рейс.длина_пути - рейс.дорога_прибытия.Длина);
            _timer.Enabled = true;
        }

        private void ComputeTime_Dialog_FormClosing(object sender, FormClosingEventArgs e)
        {
            _timer.Enabled = false;
            _мир.транспорты.Remove(_транспорт);
            foreach (var положение in _транспорт.найденные_положения)
            {
                if (положение.Дорога != null)
                {
                    положение.Дорога.занятыеПоложения.Remove(положение);
                }
            }
            if (_транспорт is Трамвай)
            {
                foreach (Трамвай.Ось ось in ((Трамвай) _транспорт).все_оси)
                {
                    ось.текущий_рельс.objects.Remove(ось);
                }
            }
            if (!(_транспорт is Троллейбус)) return;
            foreach (var штанга in ((Троллейбус) _транспорт).штанги)
            {
                if (штанга.Провод != null)
                {
                    штанга.Провод.objects.Remove(штанга);
                }
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (_components != null))
            {
                _components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this._components = new Container();
            this._cancelButton = new Button();
            this._progressBar = new ProgressBar();
            this._timer = new Timer(this._components);
            base.SuspendLayout();
            this._cancelButton.DialogResult = DialogResult.Cancel;
            this._cancelButton.Location = new Point(12, 0x20);
            this._cancelButton.Name = "_cancelButton";
            this._cancelButton.Size = new Size(0x2e9, 0x17);
            this._cancelButton.TabIndex = 0;
            this._cancelButton.Text = "Отмена";
            this._cancelButton.UseVisualStyleBackColor = true;
            this._progressBar.Location = new Point(12, 12);
            this._progressBar.Name = "_progressBar";
            this._progressBar.Size = new Size(0x2e9, 14);
            this._progressBar.Style = ProgressBarStyle.Continuous;
            this._progressBar.TabIndex = 1;
            this._timer.Interval = 1;
            this._timer.Tick += new EventHandler(this.timer_Tick);
            base.AutoScaleDimensions = new SizeF(7f, 13f);
            base.AutoScaleMode = AutoScaleMode.Font;
            base.CancelButton = this._cancelButton;
            base.ClientSize = new Size(0x301, 0x43);
            base.ControlBox = false;
            base.Controls.Add(this._progressBar);
            base.Controls.Add(this._cancelButton);
            this.Font = new Font("Verdana", 8.25f, FontStyle.Regular, GraphicsUnit.Point, 0xcc);
            base.FormBorderStyle = FormBorderStyle.FixedDialog;
            base.MaximizeBox = false;
            base.MinimizeBox = false;
            base.Name = "ComputeTimeDialog";
            base.ShowInTaskbar = false;
            base.StartPosition = FormStartPosition.CenterParent;
            this.Text = "Вычисление времени рейса";
            base.FormClosing += new FormClosingEventHandler(this.ComputeTime_Dialog_FormClosing);
            base.ResumeLayout(false);
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            if (!this._refreshing)
            {
                this._refreshing = true;
                if (this._транспорт.рейс_index == (this._рейс.pathes.Length - 1))
                {
                    this._timer.Enabled = false;
                    base.DialogResult = DialogResult.OK;
                    base.Close();
                }
                else
                {
                    this._транспорт.АвтоматическиУправлять(this._мир);
                    if (((this._транспорт.осталось_стоять > 0.0) && (this._транспорт.скорость == 0.0)) && (this._транспорт.ускорение == 0.0))
                    {
                        this._мир.системноеВремя -= this._транспорт.осталось_стоять;
                    }
                    bool flag = false;
                    if (this._транспорт is Трамвай)
                    {
                        Рельс рельс = ((Трамвай) this._транспорт).передняя_ось.текущий_рельс;
                        if ((рельс.следующие_рельсы.Length > 1) && (this._рейс.pathes[this._транспорт.рейс_index] == рельс))
                        {
                            if (this._рейс.pathes[this._транспорт.рейс_index + 1] == рельс.следующие_рельсы[0])
                            {
                                рельс.следующий_рельс = 0;
                            }
                            else if (this._рейс.pathes[this._транспорт.рейс_index + 1] == рельс.следующие_рельсы[1])
                            {
                                рельс.следующий_рельс = 1;
                            }
                        }
                    }
                    else if (this._транспорт is Троллейбус)
                    {
                        foreach (Троллейбус.Штанга штанга in ((Троллейбус) this._транспорт).штанги)
                        {
                            if (!штанга.Поднята)
                            {
                                штанга.НайтиПровод(this._мир.контактныеПровода);
                                штанга.поднимается = true;
                                штанга.угол = штанга.уголNormal;
                                if (!штанга.Поднята)
                                {
                                    flag = true;
                                }
                            }
                        }
                    }
                    this._мир.системноеВремя -= 0.275;
                    this._мир.Обновить(this._игроки);
                    string str = ". Скорость: " + ((this._транспорт.скорость * 3.6)).ToString("0.00") + " км/ч";
                    if (flag)
                    {
                        str = str + " (штанги слетели!!!)";
                    }
                    if (this._text == null)
                    {
                        this._text = this.Text;
                    }
                    this.Text = this._text + str;
                    double a = 0.0;
                    for (int i = 0; i < this._транспорт.рейс_index; i++)
                    {
                        a += this._рейс.pathes[i].Длина;
                    }
                    if ((this._транспорт.рейс_index > 0) || (this._транспорт.текущее_положение.Дорога == this._рейс.дорога_отправления))
                    {
                        a += this._транспорт.текущее_положение.расстояние;
                    }
                    this._progressBar.Value = Math.Min((int) Math.Round(a), this._progressBar.Maximum);
                    this._refreshing = false;
                }
            }
        }
    }
}

